home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 February
/
EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso
/
enigma
/
earcd
/
utility
/
utilmisc
/
maestix.lha
/
Maestix
/
demos
/
Surround.s
< prev
Wrap
Text File
|
1995-03-04
|
11KB
|
345 lines
*****************************************************************
* *
* maestix.library-Demo: Surround *
* *
*****************************************************************
*
* Programmed by Richard Körber
* Date 1995-02-01
*
*****************************************************************
* This demonstration shows how to realise a real time effect *
* using the maestix library. It allocates the Maestro sound- *
* card, select the default input and sends the surround sig- *
* nal to output. *
*****************************************************************
INCDIR "include:"
INCLUDE exec.i ; Library call macros
INCLUDE intuition.i
INCLUDE graphics.i
INCLUDE dos.i
INCLUDE maestix.i
INCLUDE libraries/maestix.i ;Reference includes
INCLUDE intuition/intuition.i
INCLUDE dos/dostags.i
INCLUDE exec/ports.i
BUFSIZE EQU 24*1024 ;size of FIFO data block
SECTION text,CODE
*---------------------------------------------------------------*
* == START OF PROGRAM == *
* *
start ;-- Open all libraries -----------------;
lea maestname(PC),a1 ;maestix
moveq #35,d0 ; V35+
exec OpenLibrary ; open
move.l d0,maestbase ; store base
beq error1 ; not found!
lea intuiname(PC),a1 ;intuition
moveq #36,d0 ; V36+
exec OpenLibrary ; open
move.l d0,intuibase ; store base
beq error2 ; not found!
lea dosname(PC),a1 ;dos
moveq #36,d0 ; V36+
exec OpenLibrary ; open
move.l d0,dosbase ; store base
beq error3
;-- Create buffer ----------------------;
move.l #BUFSIZE*5,d0 ;size of five buffers
move.l #$10001,d1 ;PUBLIC|CLEAR
exec AllocMem
move.l d0,buffer
beq error4
;-- Alloc signal bits ------------------;
sub.l a1,a1 ;get task ptr
exec FindTask
move.l d0,maintask
moveq #-1,d0 ;Allocate a 2nd signal bit
exec AllocSignal
move.b d0,donesigbit
cmp.b #-1,d0 ;no signals free?
beq.w error5
;-- Open handle window -----------------;
sub.l a0,a0 ;no newwindow struct
lea windowtags(PC),a1 ; but loads of tags
intui OpenWindowTagList
move.l d0,window
beq error6
;-- Launch surround task ---------------;
move.l #tasktags,d1 ;Tags for new task
dos CreateNewProc ;create new process
tst.l d0 ;got the task?
beq error7
moveq #0,d0 ;wait 'till 2nd task setup'd
move.b donesigbit(PC),d1 ; signal
bset d1,d0
exec Wait ;wait for this event
;-- Wait for reply (main loop) ---------;
.mainloop move.l window(PC),a0 ;window message?
move.l wd_UserPort(a0),a0 ; ^message port
exec WaitPort
.nextmsg move.l window(PC),a0 ;window message?
move.l wd_UserPort(a0),a0 ; ^message port
exec GetMsg ; try to get it...
tst.l d0 ; got one?
beq.b .mainloop ; nope: wait for next msg
;---- got a window event ---------------;
move.l d0,a0 ;^IDCMP-message -> a0
cmp.l #IDCMP_CLOSEWINDOW,im_Class(a0) ;close window?
bne.b .nextmsg ; no -> continue being idle ;)
;-- Exit program -----------------------;
exit move.l surrtask(PC),a1 ;Shut surround task
moveq #0,d0
move.b surrsigbit(PC),d1
bset d1,d0
exec Signal ; signals the exit
moveq #0,d0 ;wait 'till 2nd task exited
move.b donesigbit(PC),d1 ; signal
bset d1,d0
exec Wait ;wait for this event
error7 move.l window(PC),a0 ;Close output window
intui CloseWindow
error6 move.b donesigbit(PC),d0
exec FreeSignal
error5 move.l buffer(PC),a1 ;^Buffer
move.l #BUFSIZE*5,d0
exec FreeMem
error4 move.l dosbase(PC),a1 ;close dos library
exec CloseLibrary
error3 move.l intuibase(PC),a1 ;close intuition library
exec CloseLibrary
error2 move.l maestbase(PC),a1 ;close maestix library
exec CloseLibrary
error1 moveq #0,d0 ;Reply 0
rts ;back to CLI
*---------------------------------------------------------------*
* == SURROUND PROCESS == *
* *
SurroundProc
;-- Get exiting signal -----------------;
sub.l a1,a1 ;Get task structure
exec FindTask
move.l d0,surrtask
moveq #-1,d0 ;get sig bit
exec AllocSignal
move.b d0,surrsigbit
cmp.b #-1,d0 ;got no bit
beq .error1
move.l maintask(PC),a1 ;task is done
moveq #0,d0
move.b donesigbit(PC),d1
bset d1,d0
exec Signal ; signals the exit
;-- Allocate Maestro -------------------;
sub.l a0,a0 ;no tags
maest AllocMaestro
move.l d0,maestro ;^Maestro base
beq .error2
;-- Set Modus --------------------------;
move.l maestro(PC),a0 ;^Maestro base
lea modustags(PC),a1 ;^Modus tags
maest SetMaestro ;set it now
;-- Read Status ------------------------;
move.l maestro(PC),a0 ;^Maestro base
move.l #MSTAT_Signal,d0 ;is input signal ok?
maest GetStatus ;get the card status
tst.l d0
beq .error3
;-- Create Messageports ----------------;
exec CreateMsgPort ;create a messageport
move.l d0,rport ; as receive port
beq .error3
exec CreateMsgPort ;create a messageport
move.l d0,tport ; as transmit port
beq .error4
;-- Init messages ----------------------;
move.l rport(PC),d1 ;^Receive Reply Port
move.l tport(PC),d2 ;^Transmit Reply Port
lea msg1(PC),a0 ;^1st Message
lea msg2(PC),a1
lea msg3(PC),a2
lea msg4(PC),a3
lea msg5(PC),a4
move.l buffer(PC),d0 ;get buffer ptr
move.l d0,(dmn_BufPtr,a0) ; set buffer 1
add.l #BUFSIZE,d0
move.l d0,(dmn_BufPtr,a1) ; set buffer 2
add.l #BUFSIZE,d0
move.l d0,(dmn_BufPtr,a2) ; set buffer 3
add.l #BUFSIZE,d0
move.l d0,(dmn_BufPtr,a3) ; set buffer 4
add.l #BUFSIZE,d0
move.l d0,(dmn_BufPtr,a4) ; set buffer 5
move.l #BUFSIZE,(dmn_BufLen,a0) ;Set buffer length
move.l #BUFSIZE,(dmn_BufLen,a1)
move.l #BUFSIZE,(dmn_BufLen,a2)
move.l #BUFSIZE,(dmn_BufLen,a3)
move.l #BUFSIZE,(dmn_BufLen,a4)
move.l d1,(MN_REPLYPORT,a0) ;Set Reply-Port
move.l d1,(MN_REPLYPORT,a1)
move.l d2,(MN_REPLYPORT,a2)
move.l d2,(MN_REPLYPORT,a3)
move.l d2,(MN_REPLYPORT,a4)
move #dmn_SIZEOF,(MN_LENGTH,a0) ;Set msg length
move #dmn_SIZEOF,(MN_LENGTH,a1)
move #dmn_SIZEOF,(MN_LENGTH,a2)
move #dmn_SIZEOF,(MN_LENGTH,a3)
move #dmn_SIZEOF,(MN_LENGTH,a4)
;-- Start receive process --------------;
move.l maestro(PC),a0 ;transmit msg to library
lea msg1(PC),a1
maest ReceiveData ; the 1st (starts receiver!)
move.l maestro(PC),a0
lea msg2(PC),a1
maest ReceiveData ; and the 2nd
move.l maestro(PC),a0
lea msg3(PC),a1
maest TransmitData ; and the 3rd
move.l maestro(PC),a0
lea msg4(PC),a1
maest TransmitData ; and the 4th
move.l maestro(PC),a0
lea msg5(PC),a1
maest TransmitData ; and the 5th
;-- wait for messages ------------------;
.mainloop move.l tport(PC),a0 ;maestix message?
exec GetMsg ; try to get it...
tst.l d0 ; got one?
bne.b .gottransmit ; then evaluate it
move.l rport(PC),a0 ;receive message?
exec GetMsg
tst.l d0
bne.b .gotreceive
moveq #0,d0 ;create wait mask
move.b surrsigbit(PC),d1 ; signal for exiting
bset d1,d0
move.l rport(PC),a0 ; second, from receive port
move.b MP_SIGBIT(a0),d1 ; sig bit
bset d1,d0 ; set this bit
move.l tport(PC),a0 ; last, from transmit port
move.b MP_SIGBIT(a0),d1
bset d1,d0
exec Wait ;wait for these events
move.b surrsigbit(PC),d1 ; exit forced?
btst d1,d0 ; test this bit
beq.b .mainloop ;not wanted -> main loop
bra.b .exit ; wanted -> leave
;---- got a transmitter event ----------;
.gottransmit move.l maestro(PC),a0 ;Re-send message
move.l d0,a1
move.l rport(PC),(MN_REPLYPORT,a1) ;Set Reply-Port
maest ReceiveData ; to maestix library
bra.b .mainloop
;---- got a receive event --------------;
.gotreceive bsr surround ;do the surround
bra.b .mainloop ;and try again
;-- Leave task -------------------------;
.exit move.l maestro(PC),a0 ;Flush all messages
maest FlushTransmit
move.l maestro(PC),a0
maest FlushReceive
move.l tport(PC),a0 ;delete transmit port
exec DeleteMsgPort
.error4 move.l rport(PC),a0 ;delete receive port
exec DeleteMsgPort
.error3 move.l maestro(PC),a0 ;Set maestro free
maest FreeMaestro
.error2 move.l maintask(PC),a1 ;task is done
moveq #0,d0
move.b donesigbit(PC),d1
bset d1,d0
exec Signal ; signals the exit
.error1 rts ;done (freed by DOS)
*-------------------------------------------------------*
* surround calculate surround data *
* -» D0.l ^Maestro Msg *
* *
surround move.l d0,a1 ;get ptr
;-- Get pointers -----------------------;
move.l dmn_BufPtr(a1),a0 ;a0: ^received data
move.l dmn_BufLen(a1),d0
lea (a0,d0.l),a2 ;a2: ^end of buffer
;-- Surrounding ------------------------;
.loop move (a0),d0 ;left word
ext.l d0
move 2(a0),d1 ;right word
ext.l d1
sub.l d1,d0 ;difference
asr.l #1,d0
move d0,(a0)+
move d0,(a0)+
cmp.l a2,a0 ;end reached?
blo.b .loop
;-- Send buffer to transmitter ---------;
move.l maestro(PC),a0 ;Send message
move.l tport(PC),(MN_REPLYPORT,a1) ;Set Reply-Port
maest TransmitData ; to transmitter
;-- Done -------------------------------;
rts
*---------------------------------------------------------------*
* == DATA SECTION == *
* *
maintask dc.l 0 ;^Main task
surrtask dc.l 0 ;^Surround task
surrsigbit dc.b 0 ;Surround task signal bit
donesigbit dc.b 0 ;Main task done sigbit
even
maestbase dc.l 0 ;^Maestix Lib Base
intuibase dc.l 0 ;^Intuition Lib Base
dosbase dc.l 0 ;^DOS Lib Base
maestro dc.l 0 ;^Maestro Base
rport dc.l 0 ;^Receive MsgPort
tport dc.l 0 ;^Transmit MsgPort
buffer dc.l 0 ;^Data buffer
window dc.l 0 ;^Window structure
msg1 ds.b dmn_SIZEOF ;^first message
msg2 ds.b dmn_SIZEOF ;^second message
msg3 ds.b dmn_SIZEOF ;^third message
msg4 ds.b dmn_SIZEOF ;^fourth message
msg5 ds.b dmn_SIZEOF ;^fifth message
modustags dc.l MTAG_Input,INPUT_STD ;use standard input
dc.l MTAG_Output,OUTPUT_FIFO
dc.l MTAG_CopyProh,CPROH_OFF
dc.l MTAG_Emphasis,EMPH_OFF
dc.l MTAG_Source,SRC_INPUT
dc.l MTAG_Rate,RATE_INPUT
dc.l TAG_DONE
tasktags dc.l NP_Entry,SurroundProc ;<- New process' tags
dc.l NP_Priority,30
dc.l NP_Name,.name
dc.l TAG_DONE
.name dc.b "Maestix surround process",0
even
windowtags dc.l WA_IDCMP,IDCMP_CLOSEWINDOW ;<- New window's tags
dc.l WA_Title,.title
dc.l WA_InnerWidth,150
dc.l WA_InnerHeight,0
dc.l WA_DragBar,-1
dc.l WA_DepthGadget,-1
dc.l WA_CloseGadget,-1
dc.l WA_Activate,-1
dc.l WA_RMBTrap,-1
dc.l TAG_DONE
.title dc.b "Surround generator",0
even
maestname dc.b "maestix.library",0 ;Maestix name
intuiname dc.b "intuition.library",0 ;Intuition name
dosname dc.b "dos.library",0 ;DOS name
even
*---------------------------------------------------------------*
* == END == *
* *
END